home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / hf / dsp / dspdsk3 / lms.asm < prev    next >
Encoding:
Assembly Source File  |  1994-03-15  |  12.7 KB  |  531 lines

  1. ;  W9GR autonotcher
  2. ;
  3. ;  Ported for the TI 320C26 DSK by Johan Forrer KC7WW Jan. 1994
  4. ;  Bug fixes reported by HB8JNX re: SUBK 1,11
  5. ;  Added LED outputs
  6. ;
  7. ;* Filter length = 24 Delay length = 65
  8. ;* Both notcher and denoiser functions, selected by BIO switch
  9. ;* LMS coefficients are decayed one at a time per program loop
  10.  
  11. ;--------------------------------------------------------------------------
  12. ;* BIO=1 > AUTOMATIC NOTCH
  13. ;* BIO=0 > DENOISING FUNCTION
  14. BIO_Z    .set    1
  15.  
  16. NFIR    .set    24      ; LENGTH OF WIENER FIR FILTER
  17. NFIR_1    .set    23
  18. NDEL    .set    65      ; LONG DELAY FOR NOTCHER
  19. NDEL_1    .set    64
  20. SDEL    .set    1       ; SHORT DELAY FOR DENOISER MODE
  21. SDEL_1    .set     0
  22.  
  23. CONF_1    .set    0
  24. CONF_2  .set    1
  25.  .if CONF_1 
  26.     .ds    0x400    ; beginning of data
  27.  .endif
  28.  .if CONF_2 
  29.     .ds    0x600    ; beginning of data
  30.  .endif
  31. ;                ; AIC working parameters
  32. ;-----------------------------------------------------------------------------
  33. TA    .set    20      ;
  34. RA    .set    20      ; 
  35. TAp    .set    1       ;
  36. RAp    .set    1       ;
  37. TB    .set    15      ;
  38. RB    .set    15      ;
  39. AIC_CMD    .set    028h    ; bit    0     =enable/disable input bandpass
  40.             ;        1     =enable/disable loopback
  41.             ;        2     =enable/disable AUX input
  42.             ;        3     =sync I/O
  43.             ; bits 5&4: 11 =+/-6V    
  44.             ;           01h=+/-3V
  45.             ;           10h=+/-1.5V
  46. ;-----PAGE 12----------------------------------------------------------------
  47. NBETA:   .word     01000h    ; 01000 BETA VALUE (NOTCH)
  48. NDECAY:  .word     07FE4h      ; 07FE4 DECAY VALUE (NOTCH) (>8000 => NO DECAY)
  49. CBETA:   .word     01800h      ; BETA VALUE (DENOISE)
  50. CDECAY:  .word     07D80h      ; DECAY VALUE (DENOISE) (>8000 => NO DECAY)
  51. ONES:    .word     0FFFFh      ; ALL ONES FOR EX-OR
  52. ;
  53. ; INPUT SIGNAL DELAY (NOTCH) - 65 taps
  54. ;
  55.  
  56. X:      .word   0          ; FILTER DELAY (NOTCH)
  57. X1:    .word    0
  58. X2:    .word    0
  59. X3:    .word    0
  60. X4:    .word    0
  61. X5:    .word    0
  62. X6:    .word    0
  63. X7:    .word    0
  64. X8:    .word    0
  65. X9:    .word    0
  66. X10:    .word    0
  67. X11:    .word    0
  68. X12:    .word    0
  69. X13:    .word    0
  70. X14:    .word    0
  71. X15:    .word    0
  72. X16:    .word    0
  73. X17:    .word    0
  74. X18:    .word    0
  75. X19:    .word    0
  76. X20:    .word    0
  77. X21:    .word    0
  78. X22:    .word    0
  79. X23:    .word    0
  80.  
  81. W:      .word   0          ; LMS COEFFICIENTS
  82. W1:    .word    0
  83. W2:    .word    0
  84. W3:    .word    0
  85. W4:    .word    0
  86. W5:    .word    0
  87. W6:    .word    0
  88. W7:    .word    0
  89. W8:    .word    0
  90. W9:    .word    0
  91. W10:    .word    0
  92. W11:    .word    0
  93. W12:    .word    0
  94. W13:    .word    0
  95. W14:    .word    0
  96. W15:    .word    0
  97. W16:    .word    0
  98. W17:    .word    0
  99. W18:    .word    0
  100. W19:    .word    0
  101. W20:    .word    0
  102. W21:    .word    0
  103. W22:    .word    0
  104. W23:    .word    0
  105.  
  106. D:       .word     0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
  107. D10:     .word     0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  108. D20:     .word     0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  109. D30:     .word     0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  110. D40:     .word     0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  111. D50:     .word     0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  112. D60:     .word     0, 0, 0, 0
  113. D64:     .word     0
  114.  
  115. BETA:    .word     0           ; BETA VALUE (NOTCH)
  116. DECAY:   .word     0           ; DECAY VALUE (>8000 => NO DECAY)
  117. ONE:     .word     1           ; CONSTANT 1
  118. Y:       .word     0           ; WIENER FIR FILTER OUTPUT
  119. E:       .word     0           ; ERROR SIGNAL
  120. EBETA:   .word     0           ; E*BETA
  121. SQUARE:  .word     0           ; INPUT SQUARED
  122. LED:     .word     0           ; LED DISPLAY
  123. TEMP:    .word     0           ; TEMPORARY STORAGE
  124. HPFOUT:  .word     0           ; HPF OUTPUT
  125. ;-----PAGE 13----------------------------------------------------------------
  126. ;
  127. ;* 0.5 DB/40 DB ELLIPTIC IIR HPF
  128. ;* PASS 300 HZ REJ 35 HZ
  129. ;* HPF COEFFICIENTS:
  130. HPF:    .word  3644    ;HPF NETWORK COEFFICIENTS
  131. HPF1:    .word -7288
  132. HPF2:    .word  3644
  133. HPF3:    .word  7700
  134. HPF4:    .word -3644
  135.  
  136. INP:    .word   0       ;INPUT DELAY - USED FOR HPF
  137. INP1:    .word    0
  138. INP2:    .word    0
  139.  
  140. DENOM:   .word  0        ;INPUT HPF DENOMINATOR DELAY
  141. DENOM1:  .word    0
  142. ;----------------------------------------------------------------------------
  143.  
  144.     .include  "mmregs.asm"
  145.         .ps     0xFA0A          ;
  146.         B    RINT            ;FA0A  RINT
  147.         .ps     0xFA0C          ;
  148.     B    XINT        ;FA0C  XINT
  149.  
  150. ***********************************************************************
  151.         .ps     0xFB00        ; Bootloader transfers here
  152.     .entry                  ; This is a must!
  153.  
  154.  
  155.     zac    
  156.     ldpk    IMR        ; IMR disable any further interrupts
  157.     sacl    IMR
  158.  
  159.     ssxm            ; set sign extention mode 
  160.     SOVM
  161. * Reset and initialze the AIC
  162.     call    AIC_SET 
  163.  
  164.     LARP    AR0
  165.     lark    AR0,NDEL_1
  166.     lark    AR1,NFIR_1
  167.  
  168.     eint            ; Turn interrupts on
  169.  
  170. ;* MAIN PROGRAM LOOP
  171.  
  172. AGAIN:  idle
  173.     B    AGAIN
  174.  
  175. RINT
  176.     dint
  177.  
  178.         ldpk     DRR        ; point to memory mapped serial port recieve reg
  179.         lac      DRR         ; load accumulator with word received from AIC
  180. ;        sfr                  ; shift right twice to remove unused lsb's
  181. ;        sfr                  ;
  182.  
  183.     ldpk    INP        ; this sets page 13
  184.     SACL    INP          ; save input sample
  185.  
  186. ;* INPUT HIGHPASS FILTER:
  187.  
  188. ;*       NUMERATOR         ; all page 13 stuff
  189.  
  190.     ZAC
  191.     LT      INP2
  192.     MPY     HPF2
  193.     LTD     INP1
  194.     MPY     HPF1
  195.     LTD     INP
  196.     MPY     HPF
  197.  
  198. ;*       DENOMINATOR
  199.  
  200.     LTA     DENOM1
  201.     MPY     HPF4
  202.     LTD     DENOM
  203.     MPY     HPF3
  204.     APAC
  205.  
  206.     ADLK    1,11            ;ADD 0.5 TO ROUND    ====JF====
  207.     SACH    DENOM,4         ;SAVE WITH SHIFT
  208.  
  209.     LDPK    HPFOUT        ; HPFOUT
  210.     SACH    HPFOUT,4        ;STORE ON PAGE 12 TOO
  211.  
  212.     SAR     AR0,TEMP        ;STORE AR0
  213.     lalk    D               ;LOAD ACCUM WITH OFFSET
  214.     ADD     TEMP            ;ADD AR0 VALUE
  215.     SACL    LED             ;STORE USING LED AS TEMP LOCATION
  216.     LAR     AR0,LED         ;PUT INTO AR0
  217.     ZALH    HPFOUT          ;LOAD ACCUM WITH HPF OUTPUT
  218.     SACH    *,0             ;SAVE HPF OUTPUT IN DELAY
  219.     LAR     AR0,TEMP        ;RESTORE AR0
  220.  
  221. ;* DECAY JUST ONE LMS COEFFICIENT (NOTCH)
  222. ;* USE AR1 TO POINT TO COEFFICIENT TO BE DECAYED
  223. ;* TEMPORARILY ADD W TO AR0 CONTENTS THEN RESTORE
  224.  
  225.     LARP    AR1             ;USE AR1
  226.     SAR     AR1,TEMP        ;STORE AR1
  227.     lalk    W               ;LOAD ACCUM WITH OFFSET
  228.     ADD     TEMP            ;ADD AR1 VALUE
  229.     SACL    LED             ;STORE USING LED AS TEMP LOCATION
  230.     LAR     AR1,LED         ;PUT INTO AR1
  231.     LT      DECAY
  232.     MPY     *               ;MULTIPLY
  233.     PAC
  234.     SACH    *,1             ;PUT BACK
  235.     LAR     AR1,TEMP        ;RESTORE AR1
  236.     BANZ    ARDECAY,*-
  237.     LARK    AR1,NFIR_1
  238. ARDECAY:
  239.     ldpk    HPFOUT
  240.     ZALH    HPFOUT        ; display on LED Display
  241.     CALL    BARGRA
  242.     ldpk    HPFOUT
  243.  
  244. ;* DATA DELAY MOVE
  245.  
  246.     LARP    AR0
  247.     BANZ    TWEAK,*-
  248.                 ; BIOZ
  249.     LARK    AR0,NDEL_1      ;LOAD AR0 FOR LONG (AUTONOTCH) DELAY
  250. ;    LARK    AR0,SDEL_1      ;LOAD AR0 FOR SHORT (DENOISER) DELAY
  251.  
  252. ;* TWEAK NOTCH COEFFICIENTS, BEFORE DOING FILTERING/DATA MOVE:
  253.  
  254. TWEAK:  
  255.         larp     AR3
  256.         lrlk     AR3,X23      ; load AR3 with address of last delay element
  257.     lrlk     AR4,W23          ; load AR4 with address of last filter coef
  258.         lark     AR5,23           ; load AR5 with loop counter
  259.  
  260.     LT      EBETA
  261.  
  262. shf:       MPY     *-,AR4        ; ARP=3 (Xn)
  263.     PAC
  264.         ADDH     *,AR4        ; ARP=4
  265.         SACH     *-,0,AR5    ; ARP=4
  266.         banz     shf,*-,AR3    ; ARP=5
  267.  
  268. ;* NOTCHER/DENOISER FIR WIENER FILTER:
  269.  
  270.         larp     AR3
  271.         lrlk     AR3,X23      ; load AR3 with address of last delay element
  272.     lrlk     AR4,W23          ; load AR4 with address of last filter coef
  273.         lark     AR5,22           ; load AR5 with loop counter
  274.         zac
  275.         lt       *-,AR4
  276.         mpy      *-,AR3
  277.  
  278. lpf:       ltd     *-,AR4        ; ARP=3 (Xn)
  279.         mpy      *-,AR5        ; ARP=4
  280.         banz     lpf,*-,AR3    ; ARP=5
  281.         apac
  282.  
  283.     ADLK    1,15          ;ADD 0.5 TO ROUND        ===JF===
  284.     SACH    Y,0
  285.  
  286. ;* E = D - Y
  287.  
  288.     ZALH    HPFOUT
  289.     SUBH    Y
  290.     SACH    E
  291.  
  292.     LT      E
  293.     MPY     BETA
  294.     PAC
  295.     SACH    EBETA
  296.  
  297. ;* TAKE DATA FROM DELAY LINE AND PUT IT IN FIR FILTER
  298.  
  299.     larp    A0        ; use AR0
  300.     SAR     AR0,TEMP        ;STORE AR0
  301.     lalk    D               ;LOAD ACCUM WITH OFFSET
  302.     ADD     TEMP            ;ADD AR0 VALUE
  303.     SACL    LED             ;STORE USING LED AS TEMP LOCATION
  304.     LAR     AR0,LED         ;PUT INTO AR0
  305.     ZALH    *
  306.     SACH    X
  307.     LAR     AR0,TEMP        ;RESTORE AR0
  308.  
  309.                 ; BIOZ
  310. ;    B        DENOISE         ;TEST FOR NOTCH OR DENOISE
  311.  
  312. ;* OUTPUT NOTCHED SIGNAL TO DAC
  313.  
  314. DENOTCH:    
  315.     ZALS    E               ;NOTCHED OUTPUT SIGNAL
  316.     call    DA_DISP
  317.  
  318. ;* LOAD NOTCH VALUES FOR DECAY AND BETA
  319.     ldpk    NDECAY
  320.     ZALH    NDECAY
  321.     SACH    DECAY
  322.     ZALH    NBETA
  323.     SACH    BETA
  324.  
  325.     eint
  326.     ret
  327.  
  328. ;* OUTPUT DENOISED SIGNAL TO DAC
  329.  
  330. DENOISE: ZALS    Y               ;CORRELATOR (DENOISED)
  331.     call    DA_DISP
  332.  
  333. ;* LOAD DENOISE VALUES FOR DECAY AND BETA
  334.     
  335.     ldpk    CDECAY
  336.     ZALH    CDECAY
  337.     SACH    DECAY
  338.     ZALH    CBETA
  339.     SACH    BETA
  340.  
  341.     eint
  342.     ret
  343.  
  344. ;--------------------------------------------------------------------------
  345. XINT    ret
  346. ****************************************************************************
  347. * Routine to set up AIC
  348. ****************************************************************************
  349. AIC_SET: 
  350. *
  351. * Reset AIC by defining some GLOBAL memory space, then
  352. * reading it. 
  353.     dint                    ; Normally after reset interrupts are disabled
  354.     ldpk    DXR        ; DXR
  355.     lack    0x80            ; AIC reset by pulsing /BR (Global Data)
  356.     sach    DXR             ; send 0 to DXR (AIC)
  357.     sacl    GREG            ; 256 * 100 nS /BR pulse
  358.     lrlk    AR0,0xFFFF      ;
  359.     rptk    255             ; read junk from address 0xFFFF
  360.     lac     *,0,AR0         ;
  361.  
  362.  .if CONF_1
  363.     conf    1               ; B0    is code (FA00 - FBFF)
  364.                 ; B1,B3 is data (0400 - 07FF)
  365.  .endif
  366.  .if CONF_2
  367.     conf    2               ; B0,B1 is code (FA00 - FD00)
  368.  .endif
  369.  
  370. ;----------------------------------------------------------------------------
  371. * Configure AIC.
  372. * The transmit interrupt must be used to sense when
  373. * the AIC has processed the commands that we are sending
  374. * to it. Since interrupts have been disabled at entry, arm
  375. * the transmit interrupt first.
  376. *
  377.     LDPK    IMR
  378.     LAC    IMR
  379.     ORK    020h
  380.     SACL    IMR
  381.         eint
  382. ;-----------------------command 00 = TX/RX A-cntrs <= TA/TB
  383.         lalk       TA,9
  384.         adlk       RA,2
  385.         call       AIC_2nd
  386. ;-----------------------command 01 = TX/RX A-cntrs <= TA+TA'/TB+TB'
  387.         lalk       TAp,9
  388.         adlk       RAp,2
  389.         addk       01h
  390.         call       AIC_2nd
  391. ;-----------------------command 10 = TX/RX A-cntrs <= TA-TA'/TB-TB'
  392.         lalk       TB,9
  393.         adlk       RB,2
  394.         addk       02h
  395.         call       AIC_2nd
  396. ;-----------------------command 11 = set command register
  397.         lalk       AIC_CMD,2
  398.         addk       03h
  399.         call       AIC_2nd
  400. ;------------------------
  401.  
  402.         nop             ; Introduce a brief delay (5*tics)
  403.         nop
  404.         nop
  405.         nop
  406.         nop
  407.  
  408.         ssxm            ; Allows sign extention during shifts
  409.         spm     0        ; Disable shifts on P-reg 
  410.  
  411. * AIC is now initialized. Disable XINT, then leave only the RINT activated.
  412.  
  413.     dint
  414.     LDPK    IMR
  415.     LAC    IMR
  416.     andk    0xFFCF
  417.     ORK    010h
  418.     SACL    IMR
  419.     ret
  420. ;----------------------------------------------------------------
  421. AIC_2nd: ldpk   DXR               ;
  422.          sach   DXR               ;
  423.          idle                     ;
  424.          adlk   6,15              ;0000 0000 0000 0011 XXXX XXXX XXXX XXXX b
  425.          sach   DXR               ;
  426.          idle                     ;ACCU_hi requests 2nd XMIT
  427.          sacl   DXR               ;
  428.          idle                     ;ACCU_lo sets up registers
  429.          zac                      ;
  430.          sacl   DXR               ;make sure the word got sent
  431.          idle                     ;
  432.          ret                      ;
  433.  
  434. *---------------------------------------------------
  435. * Write accumulator to D/A
  436. *---------------------------------------------------
  437. DA_DISP:
  438. ;    sfl
  439. ;    sfl
  440.     andk     0fffch
  441.     ldpk     DXR
  442.     sacl     DXR         ; write output word to transmit register
  443.     ret
  444. ;----------------------------------------------------------------------------
  445. * SQUARE INPUT FOR LED DISPLAY, 3DB/SEGMENT
  446.  
  447. BARGRA: 
  448.     ldpk    TEMP 
  449.     SACH    TEMP
  450.     LT      TEMP
  451.     MPY     TEMP
  452.     PAC
  453.     SACH    TEMP
  454.     SUBH    SQUARE
  455.     BGZ     PEAK
  456.     ZALH    SQUARE
  457.     SUBH    ONE
  458.     ABS
  459.     SACH    SQUARE
  460.     B       DISPLAY
  461.  
  462. PEAK    ZALH    TEMP
  463.     SACH    SQUARE
  464.  
  465. * CONVERT TO DISPLAY BY BITWISE OR
  466.  
  467. DISPLAY LAC     SQUARE,12
  468.     SACH    LED
  469.  
  470.     LAC     SQUARE,11
  471.     SACH    TEMP
  472.     ZALS    TEMP
  473.     OR      LED
  474.     SACL    LED
  475.  
  476.     LAC     SQUARE,10
  477.     SACH    TEMP
  478.     ZALS    TEMP
  479.     OR      LED
  480.     SACL    LED
  481.  
  482.     LAC     SQUARE,9
  483.     SACH    TEMP
  484.     ZALS    TEMP
  485.     OR      LED
  486.     SACL    LED
  487.  
  488.     LAC     SQUARE,8
  489.     SACH    TEMP
  490.     ZALS    TEMP
  491.     OR      LED
  492.     SACL    LED
  493.  
  494.     LAC     SQUARE,7
  495.     SACH    TEMP
  496.     ZALS    TEMP
  497.     OR      LED
  498.     SACL    LED
  499.  
  500.     LAC     SQUARE,6
  501.     SACH    TEMP
  502.     ZALS    TEMP
  503.     OR      LED
  504.     SACL    LED
  505.  
  506.     LAC     SQUARE,5
  507.     SACH    TEMP
  508.     ZALS    TEMP
  509.     OR      LED
  510.     SACL    LED
  511.  
  512.     LAC     SQUARE,4
  513.     SACH    TEMP
  514.     ZALS    TEMP
  515.     OR      LED
  516.     SACL    LED
  517.  
  518.     LAC     SQUARE,3
  519.     SACH    TEMP
  520.     ZALS    TEMP
  521.     OR      LED
  522.  
  523.     cmpl                ; invert bits
  524.     SACL    LED
  525.  
  526.     OUT     LED,0            ; PA0
  527.     ret
  528. ;-------------------------------------------------------------------------
  529.     .end
  530.